Search K
Appearance
Appearance
思考
bootfs 和 rootfs 是两个关键的文件系统,它们在系统引导过程和系统运行时发挥着重要的作用。bootfs 基本一样,而 rootfs 不同,如 ubuntu,centos 等。bootfs 负责引导加载程序和内核的加载,而 rootfs 则负责提供运行时的根文件系统,使得系统能够正常启动和运行。bootfs 包含了引导加载程序(bootloader)和内核映像(kernel image)。引导加载程序负责在计算机启动时加载操作系统内核,而内核映像则是操作系统核心的二进制文件。grubx64.efi 等)。UEFI 提供了更现代和灵活的引导过程。rootfs 是一个虚拟文件系统,它在系统运行时被挂载为根文件系统。它可以是内存中的 tmpfs,也可以是硬盘上的实际文件系统,例如 ext4。rootfs 包含了系统运行时所需的基本文件和目录,包括 /bin、/sbin、/lib、/etc 等。这些文件和目录组成了用户空间的基本结构,支持系统的正常运行。rootfs 是一个虚拟文件系统,它可能是一个初始的根文件系统,而随着系统的运行,它可以被更换为其他实际的文件系统。这种灵活性允许系统在运行时切换根文件系统,例如在初始化阶段使用 initramfs 后,切换到实际的根文件系统。initramfs。initramfs 是一个临时的文件系统,它会在引导过程中加载到内存中,并在引导完成后被卸载。# 基础镜像
FROM ubuntu:20.04
# 在基础镜像上进行操作,构建新的镜像层
RUN apt-get update && apt-get install -y nginx
# 上面的 Dockerfile 中,`FROM ubuntu:20.04` 表示基础镜像是 Ubuntu 20.04 镜像
# `RUN apt-get update && apt-get install -y nginx` 表示在基础镜像上运行命令安装 Nginx,形成新的镜像层
# 这个 Dockerfile 就是一个简化的示例,实际上可能包含更多操作和配置
# 容器启动时,在最顶层加载一个读写文件系统作为容器
# 每个容器实例都有自己的顶层文件系统,可以在容器内进行读写操作,而不影响底层的镜像文件系统bootfs,并使用宿主机的 bootfs。root文件系统(rootfs),被称为基础镜像(base image)。获取正在运行的容器的 ID.
docker ps保存容器状态为镜像。
[container_id] 为容器 ID[image_name] 为新镜像的名字[tag] 为标签docker commit [container_id] [image_name]:[tag]查看新创建的镜像。
docker images推送到 Docker Hub(可选)。
docker login
docker push [image_name]:[tag]本地使用(可选)。
# 保存
docker save -o [image_name].tar.gz [image_name]:[tag]
# 加载
docker load -i [image_name].tar.gz创建 Dockerfile
Dockerfile。选择基础镜像
FROM image[:tag] [AS name]FROM 指令选择一个基础镜像作为构建的起点。常见的选择包括 alpine、debian、ubuntu、centos、node、python、nginx 等。FROM ubuntu:20.04 表示基于 Ubuntu 20.04 镜像。 scratch 是一个特殊的基础镜像,它实际上是一个空白镜像,不包含任何文件系统内容。因此,使用 scratch 作为基础镜像意味着你从头开始构建你的镜像,而不是基于其他镜像。FROM 指令中使用 AS name 为基础镜像命名,然后在后续的指令中引用这个名字。FROM ubuntu:20.04 AS builder,在后续的指令中可以使用 FROM builder 引用这个自定义的基础镜像。指定维护者的信息。
MAINTAINER xxx yourname@example.comLABEL 代替。为镜像添加元数据。
LABEL version="1.0" maintainer="yourname@example.com"运行命令和安装软件
# 安装应用程序依赖
RUN apt-get update && apt-get install -y python3RUN 指令运行命令,在基础镜像上进行操作,例如安装软件、更新软件包等。RUN apt-get update && apt-get install -y nginx 表示在基础镜像上更新软件包并安装 Nginx。复制文件
# 复制应用程序文件到容器中
COPY . /app
# 复制并解压
ADD archive.tar.gz /app/archiveCOPY 或 ADD 指令将本地文件或目录复制到镜像中。COPY ./myapp /app 表示将本地的 myapp 目录复制到镜像的 /app 目录。设置环境变量
ENV APP_HOME /app
ENV PORT 8080
# 使用环境变量在后续指令中定义路径
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . $APP_HOME
# 在容器运行时使用环境变量
ENV PORT=8080
EXPOSE $PORT
CMD ["python3", "-m", "http.server", "$PORT"]ENV 指令设置环境变量,例如 ENV APP_HOME /app。设置工作目录
# 设置工作目录
WORKDIR /appWORKDIR 指令设置工作目录,例如 WORKDIR /app。声明容器监听的端口
# 暴露应用程序的端口
EXPOSE 80EXPOSE 指令声明容器运行时监听的端口,例如 EXPOSE 80。定义启动命令
# 定义容器启动时要执行的默认命令,可以被 Dockerfile 中的任何 CMD 或 docker run 命令覆盖
CMD ["python3", "app.py"]
# 定义容器启动时要执行的命令,不可被 Dockerfile 中的 CMD 或 docker run 命令覆盖
ENTRYPOINT ["python3", "app.py"]使用 CMD 或 ENTRYPOINT 指令定义容器启动时要运行的命令。
例如,CMD ["nginx", "-g", "daemon off;"] 表示容器启动时运行 Nginx 以非守护进程方式。
构建镜像
docker build -t myapp:latest .docker build -t image_name:tag . 命令来构建镜像。image_name 是镜像名,tag 是版本标签,. 表示当前目录。推送到 Docker Hub(可选)
docker images
docker login
docker push myapp:latestdocker push your_image_name:tag 命令推送镜像。保存到本地(可选)
# 保存
docker save -o myapp.tar.gz myapp:latest
# 加载
docker load -i myapp.tar.gz运行容器(可选)
docker run -p 8080:80 myapp:latest| 关键字 | 作用 | 备注 |
|---|---|---|
FROM | 指定父镜像 | 指定 dockerfile 基于那个 image 构建。 |
MAINTAINER | 作者信息 | 用来标明这个 dockerfile 的作者。 |
LABEL | 标签 | 用来标明 dockerfile 的标签,可以使用 Label 代替 Maintainer,最终都是在 docker image 基本信息中可以查看。 |
RUN | 执行命令 | 执行一段命令,默认是 /bin/sh。 格式: RUN command 或者 RUN ["command" , "param1","param2"] |
CMD | 容器启动命令 | 提供启动容器时候的默认命令 和 ENTRYPOINT 配合使用。格式 CMD command param1 param2 或者 CMD ["command" , "param1","param2"] |
ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用。 |
COPY | 复制文件 | build 的时候复制文件到 image 中。 |
ADD | 添加文件 | build 的时候添加文件到 image 中,不仅仅局限于当前 build 上下文,可以来源于远程服务。 |
ENV | 环境变量 | 指定 build 时候的环境变量,可以在启动的容器的时候通过 -e 覆盖。格式 ENV name=value |
ARG | 构建参数 | 构建参数。只在构建的时候使用的参数。如果有 ENV ,那么 ENV 的相同名字的值始终覆盖 arg 的参数。 |
VOLUME | 定义外部可以挂载的数据卷 | 指定 build 的 image 那些目录可以启动的时候挂载到文件系统中。启动容器的时候使用 -v 绑定。格式 VOLUME ["目录"] |
EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口。启动容器的使用 -p 来绑定暴露端口。格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
WORKDIR | 工作目录 | 指定容器内部的工作目录。如果没有创建则自动创建。 如果指定 / 使用的是绝对地址。如果不是 / 开头那么是在上一条 workdir 的路径的相对路径。 |
USER | 指定执行用户 | 指定 build 或者启动的时候,用户在 RUN CMD ENTRYPONT 执行的时候的用户。 |
HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令,基本上没用。因为很多时候应用本身有健康监测机制。 |
ONBUILD | 触发器 | 当存在 ONBUILD 关键字的镜像作为基础镜像的时候,当执行 FROM 完成之后,会执行 ONBUILD 的命令。但是不影响当前镜像,用处也不怎么大。 |
STOPSIGNAL | 发送信号量到宿主机 | 该 STOPSIGNAL 指令设置将发送到容器的系统调用信号以退出。 |
SHELL | 指定执行脚本的 shell | 指定 RUN CMD ENTRYPOINT 执行命令的时候 使用的 shell。 |
/usr# 使用 centos:7 作为父镜像
FROM centos:7
# 定义作者信息
# MAINTAINER itheima <itheima@itcast.cn>
LABEL version="1.0" maintainer="yourname@example.com"
# 执行安装 vim 命令
RUN yum install -y vim
# 定义默认的工作目录
WORKDIR /usr
# 定义容器启动执行的命令
CMD ["/bin/bash"]通过 dockerfile 构建镜像:
docker build -f Dockerfile -t centos-vim:1.0 .# 使用 java:8 作为父镜像
FROM java:8
# 定义作者信息
# MAINTAINER itheima <itheima@itcast.cn>
LABEL version="1.0" maintainer="yourname@example.com"
# 将 jar 包添加到容器
ADD springboot.jar app.jar
# 定义容器启动执行的命令
CMD ["java", "-jar", "app.jar"]通过 dockerfile 构建镜像:
docker build -f Dockerfile -t java-springboot:1.0 .